Цель данного шага научиться обрабатывать сообщения, которые может посылать поток. Меняйте предыдущий шаг. Сначала сообщение нужно объявить. Свое сообщение, пользовательское. Все это мы делаем в файле TestThreadDlg.cpp, если не забыли.
...... #endif const WM_USERMSG=WM_USER+100; ///////////////////////////////////////// // CAboutDlg dialog used for App About ......
Есть. Теперь нужно создать функцию, которая будет вызываться при появлении этого сообщения.
......
///////////////////////////
// CTestThreadDlg dialog
class CTestThreadDlg : public CDialog
{
// Construction
public:
void Mess();
CTestThreadDlg(CWnd* pParent = NULL); // standard constructor
......
Описать реакции на сообщение:
BEGIN_MESSAGE_MAP(CTestThreadDlg, CDialog)
//{{AFX_MSG_MAP(CTestThreadDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON2, OnStart)
ON_BN_CLICKED(IDC_BUTTON1, OnStop)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_USERMSG,Mess)
END_MESSAGE_MAP()
И реализацию самой функции:
void CTestThreadDlg::Mess()
{
AfxMessageBox("Thread Message");
}
Для того, чтобы поток мог передать сообщение ему нужно знать HWND. Вот и передадим ее в параметрах.
void CTestThreadDlg::OnStart()
{
// TODO: Add your control notification handler code here
HWND hWnd=GetSafeHwnd();
AfxBeginThread(Threads,hWnd);
}
Сам поток через некоторое время будет посылать сообщение:
UINT Threads(LPVOID pParam)
{
Sleep(10000);
::PostMessage(HWND(pParam),WM_USERMSG,0,0);
return 0;
}
Вот и все. Можно запускать и тестировать. Нажимаете на Start, через некоторое время появится окно говорящее о том, что от потока получено сообщение.